package com.ljx.adapterMode;

/**
 * 适配器模式1 对象适配器
 * 在这种适配器模式中，适配器容纳一个它包裹的类的实例。在这种情况下，适配器调用被包裹对象。
 *
 * 定义：
 * 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作
 *
 * 使用场景：
 * 系统需要复用现有类，而该类的接口不符合系统的需求，可以使用适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
 * 多个组件功能类似，但接口不统一且可能会经常切换时，可使用适配器模式，使得客户端可以以统一的接口使用它们。
 *
 *
 *
 * 类适配器
 * 优点：可以根据需求重写Adaptee类的方法，使得Adapter的灵活性增强了。
 * 缺点：有一定局限性。因为类适配器需要继承Target类，而Java是单继承机制，所以要求Adaptee类必须是接口。
 *
 * 对象适配器
 * 优点：同一个Adapter可以把Adaptee类和他的子类都适配到目标接口。
 * 缺点：需要重新定义Adaptee行为时，需要重新定义Adaptee的子类，并将适配器组合适配。
 *
 * 接口适配器
 * 优点：可以灵活方便的选择性重写接口方法。
 * 缺点：由于是匿名内部类的形式，所以不利于代码复用。
 *
 * 经典应用：
 * 1、适配器模式最经典的使用案例就是JDK1.0时用于遍历容器的Enumeration接口，在JDK1.2时使用iterator来代替，为了兼容1.0时期的Enumeration，
 * Collections类中使用适配器模式，兼容新老版本。这里用的是对象适配模式，用iterator代替Enumeration。
 * 2、Spring框架中DispatcherServlet类的doDispatch方法中也能看到适配器模式的身影，它的作用是传递request的Controller并执行相应的方法、返回ModeView对象。
 * Spring定义了适配接口，每个Controller有自己对应的适配器实现类，从而避免了大量if/else代码
 *
 * @作者 LJX
 * @日期 2022/12/21 10:18
 */
public class AdapterTest1 {

    public static void main(String[] args) {
        Adaptee a = new Adaptee();
        Target t = new Adapter(a);
        t.output5v();
    }


}

/**
 * 原始电压
 */
class Adaptee{
    public Integer output220v(){
        return 220;
    }
}

/**
 * 目标电压接口
 */
interface Target{
    Integer output5v();
}

/**
 * 适配器
 */
class Adapter implements Target{

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public Integer output5v() {
        Integer integer = adaptee.output220v();
        System.out.println( String.format("原始电压：%d v-> 输出电压： %d v", integer, 5) );
        return 5;
    }
}